import subprocess
import random
import time

# 地图列表和车辆数量范围
maps = ["Town01", "Town02", "Town03", "Town04", "Town05", "Town10HD",
        "Town01_Opt", "Town02_Opt", "Town03_Opt", "Town04_Opt", "Town05_Opt", "Town10HD_Opt"]  # 假设这些是可用的地图


# 运行第一个脚本：更换地图
def change_map():
    map_choice = random.choice(maps)
    print(f"选择地图: {map_choice}")
    subprocess.run(["python", "../util/config.py", "-m", map_choice])


# 运行第二个脚本：生成车辆
def generate_traffic():
    vehicle_counts = random.randint(0, 200)  # 假设生成的车辆数量范围

    print(f"生成 {vehicle_counts} 辆车辆")
    subprocess.Popen(["python", "generate_traffic.py", "-n", str(vehicle_counts)])  # 使用 Popen 让它在后台运行


# 运行第三个脚本：运行仿真并提取数据
def collect_data():
    print("开始收集数据...")
    # 确保仿真平台已启动，并等待一定时间确保数据收集完成
    result = subprocess.run(["python", "extract3.py", "--sync"], capture_output=True, text=True)

    if result.returncode != 0:
        print(f"数据收集失败: {result.stderr}")
    else:
        print(f"数据收集成功: {result.stdout}")


# 主程序
def main():
    num_iterations = 10  # 设置需要重复的次数，可以根据需要调整
    timeout = 10 * 60  # 10分钟超时，单位：秒
    for _ in range(num_iterations):
        start_time = time.time()  # 记录每次循环的开始时间

        print("\n-------------------- 执行一次数据收集 --------------------")

        change_map()
        time.sleep(5)  # 等待地图切换完成，可能需要更长时间

        # 检查是否超过超时
        if time.time() - start_time > timeout:
            print("超时：地图更换步骤超过 10 分钟，终止此次循环。")
            continue  # 跳过这次循环，开始下一轮

        generate_traffic()
        time.sleep(5)  # 等待车辆生成完成，可能需要更长时间

        # 检查是否超过超时
        if time.time() - start_time > timeout:
            print("超时：生成车辆步骤超过 10 分钟，终止此次循环。")
            continue  # 跳过这次循环，开始下一轮

        collect_data()
        time.sleep(5)  # 等待仿真结束，可能需要更长时间

        # 检查是否超过超时
        if time.time() - start_time > timeout:
            print("超时：数据收集步骤超过 10 分钟，终止此次循环。")
            continue  # 跳过这次循环，开始下一轮


if __name__ == "__main__" :
    main()
